package org.moonlight.jvm.classpath.entry;

import lombok.EqualsAndHashCode;
import org.moonlight.jvm.common.Constant;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * 通配符结尾的类路径，实际上也是 CompositeEntry
 *
 * @author Moonlight
 * @createTime 2023/8/14 15:35
 **/
@EqualsAndHashCode
public class WildcardEntry extends CompositeEntry {
    public WildcardEntry(String path) {
        super(parseWildcard(path));
    }

    /**
     * 解析 以通配符结尾的类路径，将通配符转换为多个有效路径
     *   1. 路径末尾的星号去掉，得到baseDir
     *   2. 遍历 baseDir 下所有文件，挑选出 jar 包，将 jar包的绝对路径 用 File.pathSeparator 拼接起来之后返回
     *
     * @param path 以通配符结尾的类路径
     * @return String
     * @createTime 15:50 2023/8/14
     * @author moonlight
     **/
    private static String parseWildcard(String path) {
        String baseDir = path.replace("*", "");
        try (Stream<Path> walk = Files.walk(Paths.get(baseDir))) {
            // 根据后缀名选出JAR文件，通配符类路径不能递归匹配子目录下的JAR文件。
            return walk
                    .filter(Files::isRegularFile)
                    .map(Path::toString)
                    .filter(p -> p.endsWith(Constant.LOW_JAR_SUFFIX) || path.endsWith(Constant.UP_JAR_SUFFIX))
                    .collect(Collectors.joining(File.pathSeparator));
        } catch (IOException e) {
            return "";
        }
    }
}
